#define _CRT_SECURE_NO_WARNINGS 1

#include "contact.h"

//初始化通讯录
//静态版本
//void InitContact(contact* p)
//{
//	assert(p);
//	p->sz = 0;
//	memset(p->data, 0, sizeof(p->data));
//}

//动态版本
void InitContact(contact* p)
{
	assert(p);
	p->sz = 0;
	Peo* str = (Peo*)calloc(INIT_SZ, sizeof(Peo));
	if (str == NULL)
	{
		perror("InitContact:calloc");
	}
	p->data = str;
	p->capacity = INIT_SZ;
}

//增加通讯录
void AddContact(contact* p)
{
	assert(p);
	CheckCapacity(p);

	printf("请输入姓名:>\n");
	scanf("%s", p->data[p->sz].name);
	printf("请输入年龄:>\n");
	scanf("%d", &(p->data[p->sz].age ));
	printf("请输入性别:>\n");
	scanf("%s", p->data[p->sz].sex);
	printf("请输入地址:>\n");
	scanf("%s", p->data[p->sz].addr);
	printf("请输入电话:>\n");
	scanf("%s", p->data[p->sz].tele);

	p->sz++;
}


//名字查找
int FindByName(const contact* p, const char* name)
{
	assert(p&&name);
	int i = 0;
	for (i = 0; i < p->sz; i++)
	{
		if (strcmp(p->data[i].name , name)==0)
			return i;
	}
	return -1;
}

//删除通讯录
void DelContact(contact* p)
{
	char name[NAME_MAX] = { 0 };
	
	if (p->sz == 0)
	{
		printf("通讯录为空\n");
		return;
	}

	printf("请输入用户姓名:\n");
	scanf("%s", name);
	int ret = FindByName(p, name);

	if (ret == -1)
	{
		printf("该用户不存在\n");
	}
	int i = 0;
	for (i = ret; i < p->sz - 1; i++)
	{
		p->data[i] = p->data[i + 1];
	}
	printf("删除成功\n");
	p->sz--;//删除后总数减一
}

//搜索用户
void SearchContact(contact* p)
{
	printf("请输入用户姓名:>");
	char name[NAME_MAX] = { 0 };
	scanf("%s", name);
	int ret = FindByName(p, name);
	if (ret != -1)
	{
		printf("%-10s\t%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "序号", "名字", "年龄", "性别", "地址", "电话");
		printf("%-10d\t%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", ret+1,
			p->data[ret].name,
			p->data[ret].age,
			p->data[ret].sex,
			p->data[ret].addr,
			p->data[ret].tele);
	}
	else {
		printf("该用户不存在\n");
		return;
	}	
}

//展示通讯录
void ShowContact(contact* p)
{
	assert(p);
	int i = 0;
	printf("%-10s\t%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "序号","名字", "年龄", "性别", "地址", "电话");
	for (i = 0; i < p->sz; i++)
	{
		printf("%-10d\t%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n",i+1,
			p->data[i].name,
			p->data[i].age,
			p->data[i].sex,
			p->data[i].addr,
			p->data[i].tele);
	}
}

int compare(const void* a, const void* b)
{
	return strcmp(((Peo*)a)->name, ((Peo*)b)->name);
}

//排序通讯录
void SortContact(contact* p)
{
	assert(p);
	qsort(p->data, p->sz, sizeof(Peo), compare);
}


//修改通讯录
void ModifyContact(contact* p)
{
	assert(p);
	ShowContact(p);
	printf("请输入你要修改用户的序号>:");
	int num = 0;
	scanf("%d", &num);
	if (num>p->sz )
	{
		printf("序号不存在\n");
		return;
	}
	int ret = num - 1;
	printf("请输入姓名:>\n");
	scanf("%s", p->data[ret].name);
	printf("请输入年龄:>\n");
	scanf("%d", &(p->data[ret].age));
	printf("请输入性别:>\n");
	scanf("%s", p->data[ret].sex);
	printf("请输入地址:>\n");
	scanf("%s", p->data[ret].addr);
	printf("请输入电话:>\n");
	scanf("%s", p->data[ret].tele);

}

//销毁通讯录
void DestroyContact(contact* p)
{
	assert(p);
	free(p->data);
	p->data = NULL;
	p->capacity = 0;
	p->sz = 0;
	p = NULL;
}

//检查空间
void CheckCapacity(contact* p)
{
	if (p->sz == p->capacity)
	{
		Peo* str = (Peo*)calloc((ADD_SZ + p->capacity), sizeof(Peo));
		if (str == NULL)
		{
			perror("check_capacity:calloc");
		}
		p->data = str;
		p->capacity += ADD_SZ;
		printf("增容成功\n");
		printf("当前容量 %d", p->capacity);
	}
}